iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 6
0
DevOps

在後端漫遊,基礎N大建設系列 第 6

Day06 只能API嗎?還有cmd!

  • 分享至 

  • xImage
  •  

什麼是cmd?

我們在Day03有提到過API,可以透過呼叫API去觸發伺服器運作一些功能。
但有時候,專案開發人員自身單純想啟動專案程式運行一些功能,或者使用工作排程去運行專案程式的特定功能。這時候單單只有API功能可能是不足的,所以我們專案也要考慮到透過指令(cmd)參數的變化,去執行不同的功能。因此cmd簡單來說就是我們在專案內做 「指令」,可以在終端機上執行。

如果說API的輸入資料是依據網址上的參數(path、query)或請求上的body,那麼cmd的輸入資料肯定是程式指令前面的環境變數(env)以及指令後面的參數(args)。而環境變數的用法,在昨日的文章範例就使用來載入指定檔案。


實作cmd

以下範例的程式碼可以在這邊下載
同樣地,我採用Go語言做範例,不過任何語言都有差不多的方式可以實作。也歡迎大家使用不同的語言實作並分享
/images/emoticon/emoticon61.gif

  1. 首先,我們需要知道如何抓取環境變數(env)、指令參數(args)。
    這邊可以發現取參數(args)的時候,參數本身會包含執行指令
/// 編譯程式: go build -o program .
/// 執行指令: APP=ironman ./program 1 2 3

// cmd・第一式:取所有環境變數
fmt.Println("all environments: ", os.Environ())
// Output: all environments: [APP=ironman GOROOT=/usr/local/go SHELL=/bin/zsh ......忽略]

// cmd・第二式:取指定的環境變數
appInEnv := os.Getenv("APP")
fmt.Println("APP in environments: ", appInEnv)
// Output: APP in environments: ironman

// cmd・第三式:取指令參數
fmt.Println("all args: ", os.Args)
// Output: all args:  [./program 1 2 3]
  1. 定義輸入參數的功能
if len(os.Args) < 2 { // 判斷參數除了執行指令本身,有沒有額外參數
    // 如果沒有額外參數,正常結束並提示指令
    fmt.Println("請輸入其中之一的參數: demo, server")
    os.Exit(0)
}

// 定義每個指令,要執行的動作
switch os.Args[1] {
case "demo":
    fmt.Println("這是一個示範指令")

case "server":
    port := ":" + os.Getenv("PORT")
    log.Println("開始建立伺服器 ", port)
    log.Fatal(http.ListenAndServe(port, nil))

default:
    fmt.Println("請輸入其中之一的參數: demo, server")
    os.Exit(1)
}
  1. 執行結果
$ ./program 
請輸入其中之一的參數: demo, server
$ ./program demo
這是一個示範指令
$ PORT=8000 ./program server
開始建立伺服器  :8000

小結

簡易指令(cli或cmd)主要是透過環境變數(env)參數(args)的傳入資料去做多樣的變化。而指令的實作除了土炮之外,很多程式語言也都有很多神人做的套件可以直接用來製作cli,例如:Go可用Cobra、Node.js可用commander

好的指令實作方式,一定要考慮到以下幾點:

  1. 指令說明資訊:若第一次使用的人沒傳入任何資訊,應該顯示簡易說明。
  2. 使用方式:如上,對於第一次使用的人,若有提供一些使用舉例,可以幫助使用者更快速上手。
  3. 提示指令:若使用者輸入錯誤指令時,也可以針對使用者輸入指令,給予建議的指令。
  4. 中斷訊號處理:若使用者執行指令時按下「Ctrl+C」,我們可以對於中斷訊號做一些處理,讓使用者知道我們已經收到訊號,正在處理後續動作。

以上四點的範例如下:

./gola                   
GoLa指令
        啟動伺服器,提供「狼人殺」、「犯人在跳舞」...等遊戲服務
        亦可執行單一指令,或者執行背景排程功能

Usage:
  gola [command]

Examples:

        環境說明

        需傳入以下環境變數:

        ⚙  APP_ENV : 專案環境
                ✏ default       預設值
                ✏ docker        容器開發
                ✏ local         本機開發
                ✏ prod          正式

        ⚙  APP_SITE : 專案端口
                ✏ default       預設值

        --------------

        指令說明

        ⚙  主要指令
                ✏ server   運行伺服器
                ✏ schedule 運行背景排程
                ✏ run [command name] 執行指定命令

        ⚙  可執行的指令 (command name)
                ✏ demo 範例指令


        ?  舉例: APP_ENV=local APP_SITE=default ./gola server
        ?  舉例: APP_ENV=local APP_SITE=default ./gola schedule
        ?  舉例: APP_ENV=local APP_SITE=default ./gola run demo



Available Commands:
  gorpc       GoRPC服務
  grpc        GRPC服務
  help        Help about any command
  run         執行指令
  schedule    啟動背景排程
  server      啟動伺服器

Flags:
  -h, --help   help for gola

Use "gola [command] --help" for more information about a command.

上一篇
Day05 動手作配置管理(Config)
系列文
在後端漫遊,基礎N大建設6
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言